#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <string>

using namespace std;

// 系统提供的一个设备文件
// 它被用作一个数据的“黑洞”：任何写入 /dev/null 的数据都会被丢弃，就像它从未存在过一样
// 相反，从 /dev/null 读取数据会立即返回 EOF（文件结束标志），因为 /dev/null 不包含任何数据
// 可以重定向到它
const string null_file = "/dev/null";

void Deamon(const string &dir = "") {
    // 异常处理
    signal(SIGCHLD, SIG_IGN); 
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);

    // 将自己变成独立的会话
    if(fork() > 0) {
        cout << "father exists" << endl;
        exit(0);
    }
    setsid();

    // 改变运行路径
    if(!dir.empty()) {
        chdir(dir.c_str());
    }
    cout << get_current_dir_name() << endl;
    // 由于守护进程是在后台运行，不会占用前台终端的输入和输出
    // 所以输入输出不应该在通过终端获取
    // 需要重定向
    // 原本的输出内容可以写到日志中，不关心就丢弃了 
    // int fd = open(null_file.c_str(), O_RDWR);
    // if(fd < 0) {
    //     // error > log
    //     exit(1);
    // }
    // dup2(fd, 0);
    // dup2(fd, 1);
    // dup2(fd, 2);
    // if(fd > 2) {
    //     close(fd);
    // }
}